///**
// * 为了实现特殊需要，覆盖myplus-plus内的同路径类
// */
//package com.baomidou.mybatisplus.generator;
//
//import java.io.Serializable;
//import java.util.List;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.baomidou.mybatisplus.annotation.TableLogic;
//import com.baomidou.mybatisplus.annotation.TableName;
//import com.baomidou.mybatisplus.annotation.Version;
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import com.baomidou.mybatisplus.extension.activerecord.Model;
//import com.baomidou.mybatisplus.generator.config.*;
//import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
//import com.baomidou.mybatisplus.generator.config.po.TableInfo;
//import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
//import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
//
///**
// * 生成文件
// *
// * @author YangHu, tangguo, hubin
// * @since 2016-08-30
// */
//public class AutoGenerator {
//
//    private static final Logger logger = LoggerFactory.getLogger(AutoGenerator.class);
//    /**
//     * 配置信息
//     */
//    protected ConfigBuilder config;
//    /**
//     * 注入配置
//     */
//    protected InjectionConfig injectionConfig;
//    /**
//     * 数据源配置
//     */
//    private DataSourceConfig dataSource;
//    /**
//     * 数据库表配置
//     */
//    private StrategyConfig strategy;
//    /**
//     * 包 相关配置
//     */
//    private PackageConfig packageInfo;
//    /**
//     * 模板 相关配置
//     */
//    private TemplateConfig template;
//    /**
//     * 全局 相关配置
//     */
//    private GlobalConfig globalConfig;
//    /**
//     * 模板引擎
//     */
//    private AbstractTemplateEngine templateEngine;
//
//    /**
//     * 生成代码
//     */
//    public void execute() {
//        logger.debug("==========================准备生成文件...==========================");
//        // 初始化配置
//        if (null == config) {
//            config = new ConfigBuilder(packageInfo, dataSource, strategy, template, globalConfig);
//            if (null != injectionConfig) {
//                injectionConfig.setConfig(config);
//            }
//        }
//
//        // 这是唯一修改的地方，进行特殊处理
//        specialProcess();
//
//        if (null == templateEngine) {
//            // 为了兼容之前逻辑，采用 Velocity 引擎 【 默认 】
//            templateEngine = new VelocityTemplateEngine();
//        }
//        // 模板引擎初始化执行文件输出
//        templateEngine.init(this.pretreatmentConfigBuilder(config)).mkdirs().batchOutput().open();
//        logger.debug("==========================文件生成完成！！！==========================");
//    }
//
//    private void specialProcess() {
//        List<TableInfo> tableInfoList = config.getTableInfoList();
//        for (TableInfo tableInfo : tableInfoList) {
//            tableInfo.getFields().stream()
//                    // 过滤获取propertyName是title的field
//                    .filter(f -> f.getPropertyName().equals("title"))
//                    // field重置为title1
//                    .forEach(f -> f.setPropertyName(config.getStrategyConfig(), "title1"));
//        }
//    }
//
//    /**
//     * <p>
//     * 开放表信息、预留子类重写
//     * </p>
//     *
//     * @param config 配置信息
//     * @return
//     */
//    protected List<TableInfo> getAllTableInfoList(ConfigBuilder config) {
//        return config.getTableInfoList();
//    }
//
//    /**
//     * <p>
//     * 预处理配置
//     * </p>
//     *
//     * @param config 总配置信息
//     * @return 解析数据结果集
//     */
//    protected ConfigBuilder pretreatmentConfigBuilder(ConfigBuilder config) {
//        /**
//         * 注入自定义配置
//         */
//        if (null != injectionConfig) {
//            injectionConfig.initMap();
//            config.setInjectionConfig(injectionConfig);
//        }
//        /**
//         * 表信息列表
//         */
//        List<TableInfo> tableList = this.getAllTableInfoList(config);
//        for (TableInfo tableInfo : tableList) {
//            /* ---------- 添加导入包 ---------- */
//            if (config.getGlobalConfig().isActiveRecord()) {
//                // 开启 ActiveRecord 模式
//                tableInfo.setImportPackages(Model.class.getCanonicalName());
//            }
//            if (tableInfo.isConvert()) {
//                // 表注解
//                tableInfo.setImportPackages(TableName.class.getCanonicalName());
//            }
//            if (config.getStrategyConfig().getLogicDeleteFieldName() != null && tableInfo.isLogicDelete(config.getStrategyConfig().getLogicDeleteFieldName())) {
//                // 逻辑删除注解
//                tableInfo.setImportPackages(TableLogic.class.getCanonicalName());
//            }
//            if (StringUtils.isNotEmpty(config.getStrategyConfig().getVersionFieldName())) {
//                // 乐观锁注解
//                tableInfo.setImportPackages(Version.class.getCanonicalName());
//            }
//            if (StringUtils.isNotEmpty(config.getSuperEntityClass())) {
//                // 父实体
//                tableInfo.setImportPackages(config.getSuperEntityClass());
//            } else {
//                tableInfo.setImportPackages(Serializable.class.getCanonicalName());
//            }
//            // Boolean类型is前缀处理
//            if (config.getStrategyConfig().isEntityBooleanColumnRemoveIsPrefix()) {
//                tableInfo.getFields().stream().filter(field -> "boolean".equalsIgnoreCase(field.getPropertyType()))
//                        .filter(field -> field.getPropertyName().startsWith("is"))
//                        .forEach(field -> field.setPropertyName(config.getStrategyConfig(),
//                                StringUtils.removePrefixAfterPrefixToLower(field.getPropertyName(), 2)));
//            }
//        }
//        return config.setTableInfoList(tableList);
//    }
//
//    // ==================================  相关配置  ==================================
//
//    public DataSourceConfig getDataSource() {
//        return dataSource;
//    }
//
//    public AutoGenerator setDataSource(DataSourceConfig dataSource) {
//        this.dataSource = dataSource;
//        return this;
//    }
//
//    public StrategyConfig getStrategy() {
//        return strategy;
//    }
//
//    public AutoGenerator setStrategy(StrategyConfig strategy) {
//        this.strategy = strategy;
//        return this;
//    }
//
//    public PackageConfig getPackageInfo() {
//        return packageInfo;
//    }
//
//    public AutoGenerator setPackageInfo(PackageConfig packageInfo) {
//        this.packageInfo = packageInfo;
//        return this;
//    }
//
//    public TemplateConfig getTemplate() {
//        return template;
//    }
//
//    public AutoGenerator setTemplate(TemplateConfig template) {
//        this.template = template;
//        return this;
//    }
//
//    public ConfigBuilder getConfig() {
//        return config;
//    }
//
//    public AutoGenerator setConfig(ConfigBuilder config) {
//        this.config = config;
//        return this;
//    }
//
//    public GlobalConfig getGlobalConfig() {
//        return globalConfig;
//    }
//
//    public AutoGenerator setGlobalConfig(GlobalConfig globalConfig) {
//        this.globalConfig = globalConfig;
//        return this;
//    }
//
//    public InjectionConfig getCfg() {
//        return injectionConfig;
//    }
//
//    public AutoGenerator setCfg(InjectionConfig injectionConfig) {
//        this.injectionConfig = injectionConfig;
//        return this;
//    }
//
//    public AbstractTemplateEngine getTemplateEngine() {
//        return templateEngine;
//    }
//
//    public AutoGenerator setTemplateEngine(AbstractTemplateEngine templateEngine) {
//        this.templateEngine = templateEngine;
//        return this;
//    }
//}
